package com.cty.basic;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * @Auther: cty
 * @Date: 2020/1/23 19:02
 * @Description:  熟悉SAX解析流程——解析xml文件信息并存入javabean中
 * @version: 1.0
 */
public class Test02Xml02 {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //SAX解析
        //1、获取解析工厂
        SAXParserFactory factory=SAXParserFactory.newInstance();
        //2、从解析工厂获取解析器
        SAXParser parse =factory.newSAXParser();
        //3、编写处理器
        //4、注册/实现处理器（即新建一个处理器对象）
        PersonHandler handler=new PersonHandler();
        //5、加载文档，解析
        parse.parse(Thread.currentThread().getContextClassLoader()
                        .getResourceAsStream("com/cty/basic/testxml.xml")
                ,handler);

        //获取数据
        List<Person> persons = handler.getPersons();
        for(Person p:persons) {
            System.out.println(p.getName()+"-->"+p.getAge());
        }
    }
}

// 编写处理器——处理xml文件信息并保存到JavaBean中
class PersonHandler extends DefaultHandler{
    private List<Person> persons ;
    private Person person ;
    private String tag; //存储操作标签

    @Override
    //（1）文档解析开始
    public void startDocument() throws SAXException {
        persons = new ArrayList<Person>();
    }

    @Override
    //（2）元素解析开始——获取标签名qName
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(null!=qName) {
            tag = qName; //存储标签名
            if(tag.equals("person")) {
                person = new Person();
            }
        }
    }

    @Override
    //（3）解析过程——获取内容new String(ch,start,length).trim()
    public void characters(char[] ch, int start, int length) throws SAXException {
        String contents = new String(ch,start,length).trim();  //是一个递归的过程！
        if(null!=tag) { //处理了空
            if(tag.equals("name")) {
                person.setName(contents);
            }else if(tag.equals("age")) {
                if(contents.length()>0) {
                    person.setAge(Integer.valueOf(contents));
                }
            }
        }
    }

    @Override
    //（4）元素解析结束
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(null!=qName) {
            if(qName.equals("person")) {
                persons.add(person);
            }
        }
        tag = null; //tag丢弃了
    }
    @Override
    //（5）文档解析结束
    public void endDocument() throws SAXException {
    }

    //（6）返回解析对象
    public List<Person> getPersons() {
        return persons;
    }
}

/* res:
至尊宝-->9000
白晶晶-->7000
*/